Заданий вираз:
X=A2*B1+C4/(K-E1*F1) K=10974759
Згідно з завданням, в кодовому сегменті повинен бути виклик трьох процедур та їх опис. Відповідно, структура програми буде мати такий вигляд.
DOSSEG
.MODEL SMALL
; опис макросів
.STACK 100h
.DATA
; опис необхідних даних
.CODE
mov ax,@data
mov ds,ax
call INPUT
call CALCULATION
call OUTPUT
INPUT proc
;тіло процедури вводу
ret
INPUT endp
CALCULATION proc
;тіло процедури обчислень
ret
CALCULATION endp
OUTPUT proc
;тіло процедури виводу результатів
ret
OUTPUT endp
mov ah,4Ch
int 21h
END
Програма, що обраховує даний вираз була приведена в лабораторній роботі №3. Згідно з нею, вхідні дані повинні знаходитися в пам’яті за адресами від В до F, а результат – за міткою Х. Тепер, слід оформити цю програму у вигляді процедури та написати відповідні підпрограми, щоб забезпечити коректний ввід в десятковій формі, перевід в шістнадцяткову систему та зворотнє перетворення і вивід результату на екран.
Підпрограма вводу. – INPUT, обчислень – CALCULATION, виводу – OUTPUT.
Розглянемо можливості вводу даних. Це можна зробити двома способами:
1) для кожної змінної посимвольно вводити кожну цифру. В цьому випадку буде використовуватися функція 01h переривання 21h (оскільки функція 07h переривання 21h та функція 00 переривання 16h не забезпечують еховідображення, то їх використовувати в даному випадку недоцільно). В сегменті даних слід передбачити місце для зберігання введених символів. При чому, розмір відведеної пам’яті повинен дозволяти ввід змінної максимального розміру. В даному випадку змінна максимальний розмір має змінна С – 2 байт, тобто вона складається з 5 десяткових символів. Отже розмір тимчасової пам’яті для зберігання введених символів становить 5 байт. Значення в цьому місці пам’яті буде оновлюватися для кожної змінної.
2) вводити для кожної змінної рядок символів. В цьому випадку можна використати функцію 0Аh або 3Fh переривання 21h. При цьому у сегменті даних вимагається область вводу для кожної змінної, що значно збільшує об’єм коду і зрозумілість програми.
Оскільки ввід даних для кожної змінної буде відбуватися однаково, то варто написати процедуру вводу, яка буде викликатися 4 рази, вводячи кожен раз різну кількість символів і записуючи результат вводу, переведений в 10-ий формат, в іншу область пам’яті (процедура input_variable). Процес перевірки одного введеного символу на приналежність до 10-ої системи числення теж опишемо як окрему процедуру (процедура CHECK_BYTE). Крім того, слід передбачити перевірки на коректність діапазону введених чисел (наприклад процедура Err1).
При переводі в десяткову систему, використовується макрокоманда множення MY_MUL , яка дозволяє сформувати черговий множник, тобто степінь числа 10, та власне саме множення на нього.
Процедура обчислень нічим не відрізняється від програми з лабораторної роботи №4.
Тепер слід вивести результат, отриманий після обчислень, на екран в десятковому форматі. При формуванні десяткового результату слід проводити ділення на основу числення – 10 результату Х, який займає 4 байти. Для коректного ділення призначена підпрограма MY_DIV2.
Безпосередній вивід утвореного числа здійснити двома способами:
1) посимвольно виводити кожну цифру. В цьому випадку буде використовуватися функція 02h або 06h переривання 21h і жодних змін в сегмент даних вносити не треба.
2) утворити рядок символів і вивести результат повністю. В цьому випадку можна використати функцію 09h або 40h переривання 21h, які потребують у сегменті даних області виводу (тобто місця під майбутній рядок символів).
Згідно алгоритму перетворення, програма буде містити цикл, кількість повторів якого залежить від розміру результату (в байтах). В даному випадку цей розмір становить 4 байти. Зчитування даних повинно відбуватися послідовно по одному байту починаючи зі старшого. Оскільки змінна результату оголошена як слово, то щоб звернутися окремо до кожного байту слід використати директиву BYTE PTR та відносну адресацію через регістр [SI], зн...